package chwgigs_jdbc;

import java.util.ArrayList;
import java.util.List;

public class J04_Collection {

    //<콜렉션 collection>
	
	// 객체 지향 기반 프로그램 작성시
	// 종종 같은 종류의 객체의 묶음 group 이나 
	// 다른 종류의 객체 묶음을 함께 쓰는 때가 있음 
	
	// 앞서 배운 배열은 같은 종류의 객체 묶음이지만 유연성이 부족하고
	// 크기 조정도 안되고 다른 종류의 객체도 가질 수 없다.
	// 다행히 자바에는 이러한 종류의 객체를 쉽게 
	// 다룰 수 있는 인터페이스와 클래스를 제공한다. 
	// 그것이 바로 Collection 프레임 워크이다.
	// collection은 다른 종류로 구성된 객체들의 묶음을 의미
	
	// 또 다른 말로 용기 container 라고도 하는데 
	// 각 요소를 저장, 검색, 조작하는 메서드를 제공한다. 
	
	//Collection --Set, List Queue 
	// List --- ArrayList(중요) ,  Vector
	
	// Map --- AbstractMap, SortedMap
    
	// AbstractMap ---HashMap(중요)
	// Iterator, Comparator
	// 이들 대부분은 java.utill 패키지에 포함된다
	
	// <List>---동적 배열 
	// Collection 의 가장 인기있는 하위 인터페이스이다
	// ArrayList 는 List 의 가장 자주 사용하는 구현클래스 이다. 중요!!
	
	// List는 자료를 순서대로 저장하는 특성을 가진다.
	// FIFO :first in first out 선입선출 
	// 또한, 데이터를 중복으로 저장가능하다.
	// 단, Set은 중복 허용불가 
	
	// add메서드를 통해 데이터를 List의 맨끝에 추가한다.
	//
	
	//  <지네릭 (generic)>
	// collection 을 배울때 geniric 을 빼놓으면 불완전하게 collection을 배우는 것이다.
	// collection 을 사용할때 발생 할 수 있는 컴파일시간때 엄격한 자료형 검사를 지원 
	// 또한 collection 을 다룰때 대부분의 downcasting 을 제거하고 사용 할 수 있다 
	// 또한 ,C++에서 제공하는  클래스 템플릿을  작성할 수 있게 해줌 (고급)
	
	// 지네릭에서는 매개변수 자료형 parameterized type를 이용해서 
	// collection 요소의 자료형을 지정한다. 
	// 메서드의 매개변수와 비슷하게 
	//collection 에서는 <>안에 매개변수자료형을 사용 
	// List<String> result =null;
	
	
	public static void main(String[] args) {
	
          List a = new ArrayList<>();
          a.add(11111);
          a.add('수');
          a.add(123.456);
          a.add("김태희");
          a.add(new J03_MemberVO());
          
        	System.out.println(a);	  
       //ArrayList 에 저장된 객체를 하나씩 출력 
        	System.out.println(a.get(0));
        	System.out.println(a.get(1));
        	System.out.println(a.get(2));
        	System.out.println(a.get(3));
        	System.out.println(a.get(4));
        	
       //변수에 따로 저장
       //      	
       // 이유: ArrayList 에 객체를 저장할때는 대상이 무엇이든간에 
       // 무조건 Object 형으로 저장된다. 따라서 ArrayList 에 저장된
       // 객체를 꺼낼때는 객체의 자료형에 맞쳐 downcasting 이 필요
       // (JDK 5 이전) 	
        	
        	
       int num = (int) a.get(0);
       char chr = (char) a.get(1);
       float floatnum =(float) a.get(2);
       String str =(String) a.get(3);
       
       
       //하지만 이렇게 해도 일단 컴파일 오류는 없다
       // 그러나 실행하면 오류가 표시된다
       // 이런 종류의 오류는 찾기 힘들다.
       
       char chr2= (char) a.get(0); 	 //int
       Integer intg = (Integer) a.get (3); //String
      
       
      // 지네릭을 사용했을 경우 중요 !!
       List<String>abc =new ArrayList<String>(); 
      
       // List<String>abc =new ArrayList<>(); 
       // abc 라는 콜렉션(동적배열)에는  String 형식의 값만 추가 할 수 있다는 의미이다
       
       
       // 자료형을 String으로 지정했기때문에 문자만 넣어주어얗 한다.
       //abc.add(123); // 자료형 검사 후 오류 
       //abc.add('a');   // 오류
       abc.add("김태희");// 정상처리
       
       
       String xyz = abc.get(0); // 지네릭을 쓰면 형변환은 필요가 없기 때문에 편하다.  
       
       List<J03_MemberVO>results = new ArrayList<J03_MemberVO>();
       // results라는 콜렉션에는 J03_MemberVO 형식의 값만 추가 가능하다는 의미이다. 
       
       
       
       
       
       
       
       
       
       
        	
        	
        	
        	
        	
	}

}//
